// =============================1.string类型===================================
let a1 :string
a1='1'
let a2: string = '2' 
let a3 = '3'  /// ts自动判断类型

// ============================2.number类型=====================================

let b1 :number
b1 = 1
let b2 :number = 1
let b3 = 3 /// ts自动判断类型

// ============================3.bool类型=======================================
let c1 :boolean
c1 = false
let c2 :boolean = false
let c3 = false /// ts自动判断类型

// =============================4.字面量类型=====================================

let d1 :'web'|'123'|'12'
d1 = 'web'
d1 = '12'

//=================================5.any 任何类型 没有类型校验====================
let e1 
e1 = '123'
e1 = 123
e1 = []
let e2 = [] 
e2 = e1  // any可以给其他数据任意赋值

// ====================6. 未知类型 安全的any类型===========================

let f1 : unknown    // 任意类型，但不可以随意给其他数据赋值
f1 = 1
f1 = '1'
f1 = {}
let f2 = '123'
f2 = f1 as string  // 类型断言   表示类型相同时才能赋值


// ==============7.空值(undefined) 没有任何类型 常用于没有返回值的方法=========
let g1 :void  // void表示空值，只可以赋 undefined 值
g1 = undefined
function g2():void {  // 也可以用于没有返回值的函数
    console.log(1234);
}

// ===========================8.永远不会有值的一种类型=======================
let h1 :never // never 表示没有值 ，也不可以赋值

function h2(): never {  // 可以用来函数中没有返回值 ， 和陷入死循环的函数
    throw new Error('1234')
}

// ===========================9.object 语法：object | {}==========================

let i1 : {id:string,num: number,[propName:string]:any}
i1 = {id:'1',num:2,str:{}}
let i2 ={}
i2 = {id:2 ,num:1}
let i3 :object


// =========================10.array 语法：类型[] | Array<类型>====================
let j1 : [number,number,number]
j1 = [1,2,3]
let j2 :number[]
j2 = [1,2,3,4]
let j3 :string[]
j3 = ['1','2','3','4']
let j4 : Array<string>
j4 = ['1','2']

// ===============11. 固定长度的数组 语法：[类型，类型.....]================

let k1 : [number,string,{}]
k1 = [1,'2',{}]


// ===================12.枚举类型 语法：enum value{v1,v2}==========================
let l1 = 1|2|3
l1 = 1

enum type {
    '李江华'=250,
    '闭嘴吧你' = 400
}
let l2:type 
l2 = type.李江华
console.log(l2);



// ========================13.类型别名 语法： type value:==========================

type m1  = {id:number,name:string}
let m2 : m1


// ========================14.类型断言 语法： prop as type | <type>prop============

let n1 : unknown
n1 = 1
n1 =2
let n2 = '123'
n2 = n1 as string

// 


// ========================15.函数  关心其参数类型和返回值类型=======================

function o1(id:number,name:string){
    return id
}
o1(1,'1')



// =======================16.接口 interface 语法：interface{}======================

let q1 :{num: number,age: string}

interface typeList {
    id:number;
    big:string;
    [propName: string]:any
}

let q2 :typeList
q2 = {id:1,big:'1'}

let q3 = {
    q4 : [] as typeList[],
    q5 : <typeList[]>[]
}



// =========================17.泛型 <T>============================================
// 定义一个函数或类时，有些情况下无法确定其中要使用的具体类型（返回值、参数、属性的类型不能确定）


// fn2(null)//类型受限制

//any不安全 


//泛型灵活        
number/string/boolean\object\array\function\any\void\unknown\interface\type\enum\字面量/断言\tuple\nerve
